// 接口
// 1.接口初探
function printLabel(labelledObj: { label: string }) {
  console.log(labelledObj.label);
}

let myObj = { size: 10, label: 'Size 10 Object' };
printLabel(myObj);
// 将上述内容改造，如下：
interface LabeledValue {
  label: string;
}
export const printLabel1 = (labelledObj: LabeledValue) => {
  return labelledObj.label;
};
// 2.可选属性
// 接口里的属性不全都是必需的。 有些是只在某些条件下存在，或者根本不存在。 可选属性在应用“option bags”模式时很常用，即给函数传入的参数对象中只有部分属性赋值了。
interface SquareConfig {
  // 这里的？表示这个color和width属性有可能不存在
  color?: string;
  width?: number;
}
export const createSquare = (config: SquareConfig): { color: string; area: number } => {
  let newSquare = { color: 'white', area: 100 };
  if (config.color) {
    //这个位置如果将config的属性color写错，那么编辑器将提示错误：属性“colr”在类型“SquareConfig”上不存在。你是否指的是“color”?
    newSquare.color = config.color;
  }
  if (config.width) {
    newSquare.area = config.width * config.width;
  }
  return newSquare;
};
// 3.只读属性 一些对象属性只能在对象刚刚创建的时候修改其值。 你可以在属性名前用 readonly来指定只读属性:
interface Point {
  readonly x: number;
  readonly y: number;
}
let p1: Point = { x: 10, y: 20 };
console.log(p1);
// p1.x = 5; //编辑器提示报错：无法为“x”赋值，因为它是只读属性。
let a: number[] = [1, 2, 3, 4];
let ro: ReadonlyArray<number> = a;
// ro[0] = 12; // 类型“readonly number[]”中的索引签名仅允许读取。
// ro.push(5); // 类型“readonly number[]”上不存在属性“push”。
// ro.length = 100; // 无法为“length”赋值，因为它是只读属性。
// a = ro; // 类型 "readonly number[]" 为 "readonly"，不能分配给可变类型 "number[]"。不能直接把整个ReadonlyArray赋值到一个普通数组
// 如果想把整个ReadonlyArray赋值到一个普通数组，写法如下
a = ro as number[];
// readonly vs const；
